﻿#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>

//namespace：命名空间，本质是定义出⼀个域，这个域跟全局域各自独立,这样就可以避免C语言中因为重名而重定义的问题

//// “rand”: 重定义；以前的定义是“函数”

#include<stdlib.h>
//int rand = 1;//定义一个全局变量
//
//int main()
//{
//	printf("%d\n", rand);
//	return 0;
//}

////namespace本质是定义出⼀个域，这个域跟全局域各自独立，不同的域可以定义同名变量，所以下⾯的rand不在冲突了。
//namespace hds
//{
//	int rand = 1;
//}
//
//int main()
//{
//	
//	printf("%p\n", rand);//打印函数的地址
//	printf("%d\n", hds::rand);
//	return 0;
//}

////同一个命名空间中可以同时定义变量/函数/类型
//namespace hds
//{
//	int rand = 10;
//
//	int Add(int x, int y)
//	{
//		return x + y;
//	}
//
//	struct Node
//	{
//		struct Node* next;
//		int val;
//	};
//}
//
//int main()
//{
//	printf("%d\n", hds::rand);
//
//	printf("%d\n", hds::Add(2, 3));
//
//	struct hds::Node node;
//
//	return 0;
//}

//命名空间的嵌套
namespace hds
{
	int rand = 5;

	namespace zm
	{
		int rand = 10;
	}

	//...
}
//
//int main()
//{
//	printf("%d\n", hds::rand);
//	printf("%d\n", hds::zm::rand);
//	return 0;
//}

 // 多⽂件中可以定义同名namespace，他们会默认合并到⼀起，就像同⼀个namespace⼀样


////命名空间的使用
//
////指定命名空间访问
////将命名空间中某个成员展开
////将命名空间中所有成员全部展开
//
//namespace hds
//{
//	int x = 5;
//	int y = 10;
//
//	void Swap(int* a, int* b)
//	{
//		int tmp = *a;
//		*a = *b;
//		*b = tmp;
//	}
//}
//
//using hds::Swap;  //将命名空间中的Swap函数展开
//
////using namespace hds;  //将命名空间中所有成员展开
//
//int main()
//{
//	printf("%d\n", x);
//	//printf("%d\n", hds::x);
//	printf("%d\n", y);
//	//printf("%d\n", hds::y);
//	return 0;
//}

#include<iostream>
using namespace std;
//缺省参数
//给形参a一个缺省值1，形参a即为缺省参数
void Fun(int a = 1)
{
	cout << a << endl;//打印a的值
}
//int main()
//{
//	Fun();
//	Fun(5);
//	return 0;
//}

//全缺省
void Func(int a = 1, int b = 2, int c = 3)
{
	cout << a << " " << b << " " << c << endl;//打印a, b, c的值
}

//半缺省:C++规定半缺省参数必须从右往左依次连续缺省，不能间隔跳跃给缺省值。
void Fund(int a, int b = 8, int c = 9)
{
	cout << a << " " << b << " " << c << endl;
}
//int main()
//{
//	Fund(5);
//	Fund(5, 6, 7);
//	return 0;
//}

//int main()
//{
//	Fun();
//	Fun(5);
//
//	Func();
//	Func(4);
//	Func(4, 5, 6);
//
//	Fund(5);
//	Fund(5, 6, 7);
//
//	return 0;
//}

//重载函数：C++⽀持在同⼀作⽤域中出现同名函数，但是要求这些同名函数的形参不同

//参数类型不同
int Add(int x, int y)
{
	cout << "Add(int x,int y)" << endl;
	return x + y;
}

double Add(double x, double y)
{
	cout << "Add(double x, double y)" << endl;
	return x + y;
}
//int main()
//{
//	Add(5, 10);
//	Add(1.1, 2.2);
//	return 0;
//}

//参数个数不同
void F()
{
	cout << "F()" << endl;
}

void F(int a)
{
	cout << "F(int a)" << endl;
}

//参数类型顺序不同
void Fun(int a, char b)
{
	cout << "Fun(int a, char b)" << endl;
}

void Fun(char a, int b)
{
	cout << "Fun(char a, int b)" << endl;
}
int main()
{
	Fun(5, 'x');
	Fun('x', 5);
	return 0;
}


//int main()
//{
//	Add(5, 10);
//	Add(1.1, 2.2);
//
//	F();
//	F(10);
//
//	Fun(5, 'x');
//	Fun('x', 5);
//
//	return 0;
//}


//// 返回值不同不能作为重载条件，因为调⽤时也⽆法区分

//void fxx()
//{}

//int fxx()
//{
//	return 0;
//}


//// 下⾯两个函数构成重载
//// 但是f1()调⽤时，会报错，存在歧义，编译器不知道调⽤谁
//
//void f1()
//{
//     cout << "f()" << endl;
//}
//void f1(int a = 10)//缺省参数
//{
//	cout << "f(int a)" << endl;
//}